iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
佛心分享-SideProject30

門外漢的嵌入式地獄系列 第 18

Day 18 。初入嵌入式開發- 使用官方的 BSP 來開發

  • 分享至 

  • xImage
  •  

使用官方的 OpenSTLinux BSP 開發

我們可以使用官方的 BSP 來開發自己的板子,需要改的部分最主要的就是設備樹了,原因是因為官方 BSP 對應的是官方的評估版,而我們自己做的板子or像是野火、百問等等的板子,通常原理圖上的設計會不太相同。

同步官方 repo

先記得安裝 git 與 repo

  1. git
sudo apt-get install git
git config --global user.emael "xxxxxx@xxxx"
git config --global user.emael "name"
  1. repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. 創建個新的資料夾
cd <working directory path>/Distribution-Package
  1. 同步官方repo
repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-6.1-yocto-mickledore-mpu-v24.06.26

同步完成後可以看到下方圖片的這幾個資料夾,這就是 yocto 當中的 layers , 其中 openembedded 的資料夾則是比較通用的一些檔案,meta-st 則是由 ST 所提供的。

https://ithelp.ithome.com.tw/upload/images/20240813/201463252dr5DtwTcZ.png

  1. 安裝依賴
# 安裝 ST 需要的依賴
sudo apt install gcc-multilib
sudo apt install libegl1-mesa libgmp-dev libmpc-dev libsdl1.2-dev pylint python3-git python3-jinja2 python3-pip socat xterm zstd

同步後的檔案說明如下:

Distribution-Package                      OpenSTLinux distribution
├── layers 
│    ├── meta-openembedded                關於 open embedded標準 的 layer
│    ├── meta-st
│    │   ├── meta-st-openstlinux          包含了openstlinux 發行版的框架與鏡像檔設定
│    │   ├── meta-st-stm32mp              包含了 stm32mp 的 BSP 與設備描述
│    │   │   ├── recipes-bsp
│    │   │   │   ├── alsa                 ALSA(Advanced Linux Sound Architecture) 與聲卡 音效有關的 recipe
│    │   │   │   ├── ddr-firmware         DDR 與 PHY 的韌體
│    │   │   │   ├── drivers              Vivante GCNANO GPU 核心驅動程式的製作方法 (種嵌入式圖形處理單元(GPU))
│    │   │   │   ├── fip-stm32mp          fip 生成 (包括引導程式、驅動程式和其他必要的韌體文件 , 引導程式、DDR 初始化碼、BL31、BL32、BL33 )
│    │   │   │   ├── trusted-firmware-a   TF-A 的 recipe
│    │   │   │   ├── trusted-firmware-m   TF-M 的 recipe
│    │   │   │   └── u-boot               U-Boot 的 recipe
│    │   │   ├── recipes-connectivity
│    │   │   │   ├── bluetooth            藍芽的driver (掛起 and 恢復)
│    │   │   │   ├── openssl              bbappend recipe 用來將openssl 加入 SDK 用
│    │   │   ├── recipes-extended
│    │   │   │   ├── external-dt          為 BSP 元件以外的 STM32 MPU 設備提供設備樹檔案的方法
│    │   │   │   ├── linux-examples       STM32 MPU devices的liunx example 的 recipe
│    │   │   │   ├── libb64               For STM32MP15x lines  only - Library for base64 encoding/decoding data
│    │   │   │   ├── m33projects          For STM32MP15x lines  only - Recipes for firmware examples for Cortex M33
│    │   │   │   ~~├── m4coredump           For STM32MP15x lines  only - Recipes for script to manage coredump of cortexM4~~
│    │   │   │   ~~├── m4projects           For STM32MP15x lines  only - Recipes for firmware examples for Cortex M4~~
│    │   │   │   └── ~~stm32mp-g0           For STM32MP13x lines  only - Recipes for G0 USB firmware~~
│    │   │   ├── recipes-graphics
│    │   │   │   ├── gcnano-userland      Recipes for Vivante libraries OpenGL ES, OpenVG and EGL (multi backend)
│    │   │   │   └── [...]
│    │   │   ├── recipes-kernel
│    │   │   │   ├── linux                Linux kernel
│    │   │   │   └── linux-firmware       Linux firmwares (example, Bluetooth firmware)
│    │   │   │   └── [...]
│    │   │   ├── recipes-security
│    │   │   │   ├── optee                Recipes for OPTEE
│    │   │   ├── recipes-st
│    │   │   │   └── images               Recipes for the bootfs and userfs partitions binaries
│    │   │   │   └── [...]
│    │   │   └── [...]
│    │   ├── meta-st-stm32mp-addons       STMicroelectronics layer that helps managing the STM32CubeMX integration
│    │   └── scripts
│    │       ├── envsetup.sh              Environment setup script for Distribution Package
│    │       └── [...]
│    └── openembedded-core                Core metadata for current versions of OpenEmbedded (standard)

  1. 啟動環境
DISTRO=openstlinux-weston MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh

https://ithelp.ithome.com.tw/upload/images/20240813/20146325PmLbmnEA2v.png

  • DISTRO=openstlinux-westo : 這個是發行版,像是 Ubuntu 就是一種發行板,檔案位置會在stm32mp/layers/meta-st/meta-st-openstlinux/conf/distro

https://ithelp.ithome.com.tw/upload/images/20240813/20146325ca8lWaPLtw.png

  • MACHINE=stm32mp1 : 這個是我們的目標機器,也就是我們的開發板,檔案位置在 stm32mp/layers/meta-st/meta-st-stm32mp/conf/machine

https://ithelp.ithome.com.tw/upload/images/20240813/20146325lZyFBSfDtx.png

  • source layers/meta-st/scripts/envsetup.sh ,這一行則是要啟動我們的環境,ST 已經寫好腳本了。

當輸入完了 DISTRO=openstlinux-weston MACHINE=stm32mp15 source layers/meta-st/scripts/envsetup.sh 後將會在外層產生 buid 的資料夾,當中會有個 conf 的資料夾裡面會存放兩個檔案如下

https://ithelp.ithome.com.tw/upload/images/20240813/20146325DlSC4Q7QE8.png

https://ithelp.ithome.com.tw/upload/images/20240813/20146325n0w2C2chet.png

https://ithelp.ithome.com.tw/upload/images/20240813/201463257tQU1RdkUh.png

https://ithelp.ithome.com.tw/upload/images/20240813/20146325mUF5TIAkNF.png

  • bblayers.conf : 定義了編譯我們的 Linux 發行版所需要使用的 layers (metalayers)
  • local.conf : 定義了目標的 MACHINE 與 DISTRO 的設定

.bb layers 我們不太會去手動修改他,未來如果有新的 layer 要加入或者是要創建新的layer都可以使用下方指令

bitbake-layers create-layer meta-xxxxx
bitbake-layers add-layer meta-xxxxx

bitbake-layers add-layer meta-xxxxx 輸入完這個指令後,就會自動的將我們的 layer 給新增到 bblayers.conf 當中。

接著來說明一下該如何編譯,編譯的方式可以編譯官方所提供的image file , 或者是編譯由 openembedded 所預設的 image。

  • core-image-minimal : 這個是由 openembedded 所提供的,他是最小的 image 檔案,缺點是很多東西沒有,需要自己額外在 yocto 當中去安裝。
  • st-image-core : 這個則是由ST官方所提供的image 檔案,檔案比較大一點但基本所需要的功能都幫我們建立好了。
  • st-image-weston : 這個版本則是帶有GUI 等等的功能是最大的檔案,如果有顯示需求可以使用這個。

下方則是編譯的方式 ,這個過程會持續得非常久,取決你的網路跟你的電腦效能。(我自己大約是需要 6 hr)

在整個構建目錄的最上層資料夾調用下方指令

bitbake <build-target>

#####範例
bitbake core-image-minimal 

這個構建方式很依賴網路速度跟電腦規格,我們也可以先下載但是不構建

bitbake -c fetchall core-image-minimal 

下載完成後可以斷開網路離線構建。

當構建到一半遇到錯誤的時候,通常會直接停止,但我們可以透過下方的命令,先讓剩餘的任務繼續構建。

bitbake -k core-image-minimal 

-k 這個選項是告訴 BitBake 繼續構建直到不依賴這個錯誤的任務被處理

假如遇到了不知道該如何解決的構建問題時,可以透過下方指令清空目前的構建

bitbake -c cleansstate core-image-minimal

然後再重新構就一次

bitbake core-image-minimal 

編譯中的畫面如下:
https://ithelp.ithome.com.tw/upload/images/20240813/20146325Zdea4gSyxx.png

編譯後的檔案說明

下圖是我們編譯完後的檔案,會在你的 build 資料夾底下,我們所需要注意的幾個資料夾是

  • conf
  • tmp-glibc
  • workspaces

其他的資料夾有興趣可以google一下,像是 sstate 這個資料夾當我們編譯過第一次後,會存放著暫存檔案。下次編譯的時候可以讀取這邊,去比對修改過的檔案,避免全部重頭編譯。

https://ithelp.ithome.com.tw/upload/images/20240813/20146325ixhr1TbWBS.png

前面說明過conf 資料夾,所以這邊就不說明了。 tmp-glibc 資料夾裡面我們可以看到有非常多的東西。
https://ithelp.ithome.com.tw/upload/images/20240813/201463253F3K978enE.png

我們最需要注意以及會用到的就是 deploy,因為我們編譯過後的image , fliesystem 都會存放到這。進到 deloy/image 當中可以看到目標機器為名的資料夾,所有我們需要燒錄的檔案都會在這。

https://ithelp.ithome.com.tw/upload/images/20240813/20146325T0kqiStgGE.png

可以看到下方有 ext4 , tar.xz 格式的檔案,這是我們最終要燒錄的 image 檔案。其他會有些命名是 bootfs rootfs 之類的,則是我們常說的根文件系統。

https://ithelp.ithome.com.tw/upload/images/20240813/201463258raUdc3cYn.png


上一篇
Day 17 。初入嵌入式開發-設備樹 (下)
下一篇
Day 19 。初入嵌入式開發- 燒錄方式
系列文
門外漢的嵌入式地獄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言